package com.cskaoyan.javase.oop2.encapsulate._1extends._9override._3exercise;

/**
 * 读程序题
 *
 * 创建对象的过程(感兴趣可以百度一下,查看详细的过程)
 *      1.开辟内存空间,创建对象的结构,以及进行成员变量默认初始化
 *          以上过程结束后,从JVM的视角上来说,对象已经创建完毕了
 *          但是对于程序员而言,对象中的成员变量赋值还未开始,创建对象的过程还没结束
 *          还差一步执行构造器(init方法)
 *          这个过程,程序员全部都是控制不了的,而且也看不到这个过程
 *      2.接下来就是执行init方法(也就是构造器)
 *          构造方法执行完毕,init方法执行完毕,一个对象就已经创建完毕了.
 *          程序员只能够看到这个过程
 *
 * 方法调用的结果根据对象的具体类型来确定,尤其是如果对象是一个子类类型
 *          并且在这个子类类型中重写了父类的成员方法
 *          那么在调用这个重写的成员方法时,它一定执行子类重写的方法
 *
 * @since 17:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*
            100 200 200
            100 200 100
            100 100 200
            100 100 200
            不止三个结果
            正确结果:
            100 0 0
         */
        Father f = new Father();
        Son s = new Son();
        Father fs = new Son();
        System.out.println("--------------");

        Son s2 = new Son(300);
    }
}

class Father {
    int num = 100;

    public int getNum() {
        return num;
    }

    public Father() {
        System.out.println(getNum());
    }
}

class Son extends Father {
    int num = 200;

    @Override
    public int getNum() {
        return num;
    }

    public Son() {
    }

    public Son(int num) {
        this.num = num;
    }
}